#!/bin/bash


# Comando BuscarW5
#------------------

ARCHIVO_CONFIGURACION=~/.grupo08/InstalaW5.conf

#FUNCIONES

#Verifica que se haya ejevutado exitosamente IniciarW5.sh y que no BuscarW5.sh no esté ya corriendo.
function comando_habilitado {
	
	if [[ $INICIAW5_EJECUTADO_EXITOSAMENTE != 1 ]] ; then
        	LoguearW5.sh "BuscarW5" "E" "12"

        	return 1
	fi

	if [ $(ps ax | grep -v grep | grep BuscarW5 | wc -l) -gt 2 ]; then
		LoguearW5.sh "BuscarW5" "A" "13"
		return 1
	fi

}

#Loguea un mensaje, utilizando el comando LoguearW5.sh
function loguear { 
#$1: tipo de mensaje
#$2: mensaje o id_mensaje

        LoguearW5.sh "BuscarW5" "$1" "$2"

}

#Inicio.
function iniciar_buscar {

	SECUENCIA2=$(eval "cat $ARCHIVO_CONFIGURACION | grep "SECUENCIA2" | cut -d '=' -f 2")

	local cant_archivos=$(ls $ACEPDIR| wc -l)
	local num_ciclo=$((++SECUENCIA2))
	sed "s/^SECUENCIA2=.*$/SECUENCIA2=$num_ciclo=$(whoami)=$(date)/" -i $ARCHIVO_CONFIGURACION
	
	loguear "I" "---------------------------------------------------------------"
	loguear "I" "  Inicio BuscarW5 - Ciclo Nro.: $num_ciclo - Cantidad de Archivos: $cant_archivos"
	loguear "I" "---------------------------------------------------------------"

}

#Verifica que el archivo a procesar no esté ya entre los procesados.
function archivo_duplicado {

	nombre_archivo=${archivo%%.*}
	[ $( ls "$PROCDIR" | grep -c "^${nombre_archivo}\.[0-9]*" ) -ne 0 ]

}

#Rechaza un archivo, moviéndolo a Rechazados.
function rechazar_archivo {

	MoverW5.sh "$ACEPDIR/$archivo" "$RECHDIR" "BuscarW5"

}

#Busca los patrones aplicables al archivo y los devuelve en una lista de patrones.
function buscar_patrones {
	
	local patron
        while read patron; do
		
		SIS_ID=$( echo $patron | cut -d ',' -f3)
	        if [ ${archivo%_*} = $SIS_ID ]; then
			lista_patrones[${#lista_patrones[*]}]=$patron
		fi

        done <$MAEDIR/patrones

}

#Aplica el patron de búsqueda al archivo.
function aplicar_patron {
	
	patron_id=$( echo $patron | cut -d ',' -f1 )
	expresion_regular=$( echo $patron | cut -d ',' -f2 )
	contexto=$( echo $patron | cut -d ',' -f4 )
	let desde=$( echo $patron | cut -d ',' -f5 )
	let hasta=$( echo $patron | sed -e 's/\r$//' | cut -d ',' -f6 )
	
	registros_hallazgos=( $( eval grep -n $expresion_regular $ACEPDIR/$archivo | cut -d: -f1 ) )

}

#Genera resultados del patrón aplicado al archivo.
function generar_resultados {

	local nombre_archivo=${archivo%%.*}
	local dir_resultado=$PROCDIR/resultados.$patron_id
	for ((indice_hallazgos=0; indice_hallazgos<${#registros_hallazgos[@]}; indice_hallazgos++)); do
		
		if [ $contexto = linea ]; then
			resultado=$( sed -n "$((${registros_hallazgos[$indice_hallazgos]}+${desde}-1)),$((${registros_hallazgos[$indice_hallazgos]}+${hasta}-1))p" <$ACEPDIR/$archivo )
		elif [ $contexto = caracter ]; then
			resultado=$( sed -n "${registros_hallazgos[$indice_hallazgos]}p" <$ACEPDIR/$archivo | cut -c${desde}-${hasta} )
		fi
		
		echo $SECUENCIA2+-#-+$nombre_archivo+-#-+${registros_hallazgos[$indice_hallazgos]}+-#-+$resultado >> $dir_resultado

	done

}

#Genera resultados globales del archivo.
function generar_resultados_globales {

	local nombre_archivo=${archivo%%.*}
	local dir_resultado_global=$PROCDIR/rglobales.$patron_id
	echo $SECUENCIA2,$nombre_archivo,${#registros_hallazgos[@]},$expresion_regular,$contexto,$desde,$hasta >> $dir_resultado_global

}

#Marca un archivo como procesado, moviéndolo a Procesados.
function archivo_procesado {
	
	MoverW5.sh "$ACEPDIR/$archivo" "$PROCDIR" "BuscarW5"

}


#################################
#      --  BUSCARW5 --          #
#################################


if ! comando_habilitado; then
	exit 1
fi

iniciar_buscar

aceptados=($(ls $ACEPDIR))
archivos_con_hallazgos=0
archivos_sin_hallazgos=0
archivos_sin_patron=0

#Procesamiento de archivos.
for archivo in ${aceptados[@]}; do

	loguear "I" "Archivo a procesar: $archivo"
	
	#Si el archivo ya fue procesado
	#se loguea el caso y se rechaza el archivo.
	if archivo_duplicado; then
		loguear "A" "14"
		rechazar_archivo
		continue
	fi

	lista_patrones=()
	buscar_patrones

	#Si no hay patrones aplicables al archivo
	#se loguea el caso y se marca el archivo como procesado.
	if [ ${#lista_patrones[@]} -eq 0 ]; then
		loguear "I" "15"
		((++archivos_sin_patron))
		archivo_procesado
		continue
	fi

	#Aplicación de los patrones al archivo.
	archivo_con_hallazgo=false
	for (( indice_patron=0; indice_patron<${#lista_patrones[@]}; indice_patron++ )); do
		
		patron=${lista_patrones[$indice_patron]}
		aplicar_patron
		
		#Si se encuentran ocurrencias del patrón
		#se generan los resultados del mismo.
		if [ ${#registros_hallazgos[@]} -gt 0 ]; then
			generar_resultados
			archivo_con_hallazgo=true
		fi

		#Se generan los resultados globales del patron.
		generar_resultados_globales

	done
	
	#Terminada la búsqueda,
	#se marca el archivo como procesado.
	archivo_procesado
	
	if $archivo_con_hallazgo ; then
		((++archivos_con_hallazgos))
	else
		((++archivos_sin_hallazgos))
	fi

done
unset aceptados

#Fin de BuscarW5.
loguear "I" "Fin del ciclo: $SECUENCIA2"
loguear "I" "Cantidad de Archivos con Hallazgos: $archivos_con_hallazgos"
loguear "I" "Cantidad de archivos sin hallazgos: $archivos_sin_hallazgos"
loguear "I" "Cantidad de archivos sin patron aplicable: $archivos_sin_patron"

